package com.huaxin.hxmodulesystem.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.huaxin.hxmodulesystem.dto.ResponseResult;
import com.huaxin.hxmodulesystem.dto.request.AddOrganizationReqDTO;
import com.huaxin.hxmodulesystem.dto.request.UpdateOrganizationReqDTO;
import com.huaxin.hxmodulesystem.dto.response.GetOrganizationInfoRespDTO;
import com.huaxin.hxmodulesystem.dto.response.OrganizationTreeNodeDTO;
import com.huaxin.hxmodulesystem.models.Organization;

import java.util.List;
import java.util.Set;

public interface OrganizationService extends IService<Organization> {
    /**
     * 新增组织
     *
     * @param in 新增组织入参
     * @return
     */
    Organization addOrganization(AddOrganizationReqDTO in);

    /**
     * 根据组织ID获取组织信息
     *
     * @param id 组织ID
     * @return 组织基本信息
     */
    public ResponseResult<Organization> getOrganizationById(String id);

    /**
     * 修改组织
     *
     * @param in 修改组织入参
     * @return
     */
    ResponseResult<String> updateOrganization(UpdateOrganizationReqDTO in);

    /**
     * 删除组织
     *
     * @param id 组织ID
     * @return
     */
    ResponseResult<String> deleteOrganization(String id);

    /**
     * 获取组织列表
     *
     * @param pageNum  页码
     * @param pageSize 每页数量
     * @param search   搜索条件
     * @param status   组织状态
     * @return
     */
    ResponseResult<Page<Organization>> getOrganizationList(Integer pageNum, Integer pageSize, String search);

    /**
     * 获取组织详情
     *
     * @param id 组织ID
     * @return
     */
    ResponseResult<GetOrganizationInfoRespDTO> getOrganizationDetail(String id);

    /**
     * 根据组织code获取组织信息
     *
     * @param code 组织code
     * @return
     */
    Organization getOrganizationByCode(String code);

    /**
     * 绑定组织
     *
     * @param userId         用户ID
     * @param organizationId 组织ID
     * @return
     */
    ResponseResult<String> bindOrganization(String userId, String organizationId);

    /**
     * 解除组织绑定
     *
     * @param userId         用户ID
     * @param organizationId 组织ID
     * @return
     */
    ResponseResult<String> unbindOrganization(String userId, String organizationId);

    /**
     * 组织审核
     *
     * @param organizationId 组织ID
     * @param status         0-待审核 1-审核通过 2-审核未通过
     */
    ResponseResult<String> auditOrganization(String organizationId, Integer status);

    //根据组织code判断组织是否存在
    ResponseResult<Boolean> queryOrganizationExist(String code);

    /**
     * 获取组织树
     *
     * @return 组织树
     */
    List<OrganizationTreeNodeDTO> getOrganizationTree();

    /**
     * 获取指定组织及其所有子组织的 ID 集合（含自身）
     *
     * @param orgId 组织ID
     * @return 包含自身的所有子孙组织ID集合
     */
    Set<String> getOrgAndChildrenIds(String orgId);
}